package com.example.myweb.Common;


import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.http.HttpStatus;

/**
 * 统一API响应结构体
 *
 * @param <T> 泛型，表示响应数据体的类型
 */
@JsonInclude(JsonInclude.Include.NON_NULL) // 仅包含非null的字段在JSON输出中，这是好的实践
// @JsonPropertyOrder({"code", "message", "data"}) // 可选，定义JSON字段的顺序
public class ApiResponse<T> {

    private int code;
    private String message;
    private T data;

    // --- 构造函数 ---

    public ApiResponse() {
    }

    public ApiResponse(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    // --- 静态工厂方法：用于方便创建不同类型的响应 ---

    /**
     * 创建一个成功的 API 响应（HTTP 状态码通常为 200）。
     *
     * @param data    响应数据体
     * @param message 成功消息
     * @param <U>     数据类型
     * @return 包含成功状态和数据的 ApiResponse 实例
     */
    public static <U> ApiResponse<U> success(U data, String message) {
        return new ApiResponse<>(200, message, data); // 或者使用 HttpStatus.OK.value()
    }

    /**
     * 创建一个成功的 API 响应，不包含数据体（HTTP 状态码通常为 200）。
     * 例如用于登出、操作成功但无需返回特定数据的场景。
     * 修正：返回类型改为 ApiResponse<Void>，明确表示无数据。
     *
     * @param message 成功消息
     * @return 包含成功状态的 ApiResponse 实例
     */
    public static ApiResponse<Void> success(String message) {
        return new ApiResponse<>(200, message, null); // 或者使用 HttpStatus.OK.value()
    }

    /**
     * 创建一个失败的 API 响应，不包含额外数据体。
     * 修正：返回类型改为 ApiResponse<Void>，明确表示无数据。
     *
     * @param code    错误状态码
     * @param message 错误消息
     * @return 包含失败状态和错误消息的 ApiResponse 实例
     */
    public static ApiResponse<Void> error(int code, String message) {
        return new ApiResponse<>(code, message, null);
    }

    /**
     * 创建一个失败的 API 响应，包含额外数据体（例如验证错误详情）。
     *
     * @param code    错误状态码
     * @param message 错误消息
     * @param data    错误数据体 (例如 Map<String, String> errors)
     * @param <U>     数据类型
     * @return 包含失败状态、错误消息和错误数据体的 ApiResponse 实例
     */
    public static <U> ApiResponse<U> error(int code, String message, U data) {
        return new ApiResponse<>(code, message, data);
    }

    // 可以在这里添加一个基于 HttpStatus 的 error 方法，更方便使用
    // 与 GlobalExceptionHandler 的使用方式保持一致
    public static <U> ApiResponse<U> error(org.springframework.http.HttpStatus status, String message) {
        return new ApiResponse<>(status.value(), message, null);
    }


    // --- Getter 和 Setter 方法 ---

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    // --- toString 方法（可选，但推荐用于调试）---

    @Override
    public String toString() {
        return "ApiResponse{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }
}